package demo01;

/*
 * final关键字代表最终、不可改变的。
 * 
 * 常见四种用法：
 * 1. 可以用来修饰一个类
 * 2. 可以用来修饰一个方法
 * 3. 可以用来修饰一个局部变量
 * 4. 可以用来修饰一个成员变量
 */
public class Demo01Final {
    public static void main(String[] args) {
        int num1 = 10;
        System.out.println(num1); // 10
        num1 = 20;
        System.out.println(num1); // 20

        // 一旦使用final用来修饰局部变量，那么这个变量就不能进行更改
        // “一次赋值，终生不变”
        final int num2 = 200;
        System.out.println(num2); // 200
        // num2 = 250; // 错误写法！final修饰变量后变量不再能改变
        
        final int num3;
        num3 = 30; // 正确写法，final修饰的变量只要保证有唯一一次赋值即可

        // 对于基本类型来说，final修饰的变量不可变，指的是变量中的数据不可改变
        // 对于引用类型来说，final修饰的变量不可变，指的是变量中的地址值不可改变
        Student stu1 = new Student("土司鸡");
        System.out.println(stu1.getName()); // 土司鸡
        System.out.println(stu1);
        stu1 = new Student("粹花"); // stu1地址值发生改变
        System.out.println(stu1.getName()); // 粹花
        System.out.println(stu1); // 地址结果与上次输出不同
        System.out.println("===============================");

        final Student stu2 = new Student("老虎");
        // stu2 = new Student("土豆"); // 错误写法！final修饰的引用类型变量，其地址值不可改变
        System.out.println(stu2.getName());
        stu2.setName("老夫啊~~~");
        System.out.println(stu2.getName()); // 正确写法，final修饰后只要不改地址值(赋值新引用类型对象)，对象里面的内容可随意更改
    }
}
